home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 726-750 / 743 / foco / foco.c < prev    next >
C/C++ Source or Header  |  1995-03-18  |  24KB  |  1,044 lines

  1. /*
  2.  * FoCo: Formatier-Kontroll-Programm
  3.  *       (GadTools-Commodities-etc-Einführung)
  4.  *
  5.  *       Autor: Michael Balzer
  6.  *              balzer@heike.informatik.uni-dortmund.de
  7.  *              M.BALZER@AWORLD.ZER
  8.  * 
  9.  * 03/91: Erste Version (primär für MacSoft Highlights-Serie)
  10.  *        Version 1.0
  11.  * 
  12.  * 10/91: Änderung, Delay bevor Drivecheck durchgeführt wird
  13.  *        (stand schon lange an...) und Quit-Frage bei CloseWindow
  14.  *        Version 1.1
  15.  * 
  16.  * 01/92: Auf Anregung von Georg Windisch doch nochmal bearbeitet...
  17.  *        Bug gefunden, verursachte die überlangen Disk-Anlaufzeiten.
  18.  *        Ausserdem Support für Olsens Format-Replacement (neue Flags)
  19.  *        und Anpassung der Tooltype-Keywords an den "CX_"-Standard.
  20.  *        Und ein bisschen Kosmetik :-)
  21.  *        ACHTUNG! Keine alten Languagefiles verwenden!
  22.  *        Version 1.2
  23.  *        
  24.  */
  25.  
  26.  
  27. #ifndef FOCO_HDR
  28. # include "FoCo.h"
  29. #endif
  30.  
  31.  
  32. /********************************************************************
  33.  * DEKLARATIONEN:
  34.  */
  35.  
  36.  
  37. void ArgArrayDone( void );
  38. UBYTE **ArgArrayInit( LONG arg1, UBYTE **arg2 );
  39. LONG ArgInt( UBYTE **arg1, UBYTE *arg2, LONG arg3 );
  40. UBYTE *ArgString( UBYTE **arg1, UBYTE *arg2, UBYTE *arg3 );
  41. CxObj *HotKey( UBYTE *arg1, struct MsgPort *arg2, LONG arg3 );
  42.  
  43.  
  44. int GetChangeNum( int unit );
  45. int GetBADNum( void );
  46.  
  47. void LiesProgrammTexte( char *filename );
  48. void InitAll( int argc, char **argv );
  49.  
  50. struct Gadget *CreateAllGadgets( struct Gadget **glistptr, 
  51.     void *vi, UWORD topborder );
  52.  
  53. void ShowWindow( void );
  54. void HideWindow( void );
  55.  
  56. void ende( int, STRPTR );
  57.  
  58. void DoFormat( void );
  59.  
  60. void handleCxMsg( struct Message *msg );
  61. void handleWinMsg( void );
  62.  
  63. void main( int argc, char *argv[] );
  64.  
  65.  
  66. /********************************************************************
  67.  * GadgetIDs:
  68.  */
  69.  
  70.  
  71. #define GAD_DRIVE        1
  72. #define GAD_NAME        2
  73. #define GAD_FFS            3
  74. #define GAD_NOICONS        4
  75. #define GAD_QUICK        5
  76. #define GAD_OK            6
  77. #define GAD_CANCEL        7
  78.  
  79. /*
  80.  *  Die folgenden haben nur bei Verwendung von Olaf (Olsen) Barthels
  81.  *  Format-Replacement eine (sinnvolle :-) Funktion
  82.  */
  83. #define GAD_NOVERIFY    8
  84. #define GAD_INSTALL        9
  85. #define GAD_EJECT        10
  86.  
  87.  
  88. /********************************************************************
  89.  *  Globale Variablen...
  90.  */
  91.  
  92.  
  93. extern struct Library        *SysBase, *DOSBase;
  94. extern struct Library        *IconBase;
  95.  
  96. struct IntuitionBase        *IntuitionBase = NULL;
  97. struct GfxBase                *GfxBase       = NULL;
  98. struct Library                *GadToolsBase  = NULL;
  99. struct Library                *CxBase        = NULL;
  100.  
  101. struct Screen                *mysc  = NULL;
  102. struct Gadget                *glist = NULL;
  103. struct Window                *mywin = NULL;
  104.  
  105. void                        *vi = NULL;
  106. struct RastPort                *rp;
  107. int                            Xwidth, WinWidth, WinHeight;
  108. UWORD                        topborder;
  109. ULONG                        windowsignal = 0;
  110.  
  111.  
  112. STRPTR DiskList[5] = { NULL,NULL,NULL,NULL,NULL };
  113. STRPTR DiskName[4] = { "DF0:","DF1:","DF2:","DF3:" };
  114.  
  115.  
  116. char *TextSpeicher = 0;
  117. #define _COUNT_TXT 18
  118. char *ProgrammText[ _COUNT_TXT ] =
  119. {
  120.     "Formatter",
  121.     "You just inserted an unreadable disk\n"
  122.     "in drive %s.\n"
  123.     "Do you want it to be formatted?",
  124.     " Yes |   NO!   ",
  125.     "User-friendly disk formatter",
  126.     "Pops up on disk insertion/hotkey",
  127.     "Drive:",
  128.     "Name:",
  129.     "FFS",
  130.     "No Icons",
  131.     "Quick",
  132.     "Format!",
  133.     "Cancel!",
  134.     "Format Disk...",
  135.     "CON:0/0/512/83/Formatting Disk...",
  136.     "Quit FoCo?",
  137.     "No Verify",
  138.     "Install",
  139.     "Eject"
  140. };
  141. #define TXT(n) ProgrammText[n]
  142.  
  143.  
  144. struct EasyStruct formatreq =
  145. {
  146.     sizeof( struct EasyStruct ), 0,
  147.     0, 0, 0
  148.     /*TXT(0), TXT(1), TXT(2)*/
  149. };
  150.  
  151. struct EasyStruct quitreq =
  152. {
  153.     sizeof( struct EasyStruct ), 0,
  154.     0, 0, 0
  155.     /*TXT(0), TXT(14), TXT(2)*/
  156. };
  157.  
  158.  
  159. /********************************************************************
  160.  * Trackdisk-Variablen
  161.  */
  162.  
  163.  
  164. struct IOExtTD                *ioexttd[4]={ 0,0,0,0 };
  165. int                            changenum[4];
  166. struct MsgPort                *tdport=0;
  167.  
  168.  
  169. /********************************************************************
  170.  *  Adressen der Gadgets, Status-Variablen
  171.  */
  172.  
  173.  
  174. struct Gadget    *drivegad, *namegad, *ffsgad, *noiconsgad, *quickgad,
  175.                 *noverifygad, *installgad, *ejectgad;
  176.  
  177. int                drive;
  178. char            name[33];
  179.  
  180. BOOL            bffs=TRUE, bnoicons=TRUE, bquick=FALSE,
  181.                 bnoverify=FALSE, binstall=FALSE, beject=FALSE;
  182.  
  183.  
  184. /********************************************************************
  185.  * Commodities-Variablen
  186.  */
  187.  
  188.  
  189. char                    **ttypes = NULL, *hotstr;
  190.  
  191. struct MsgPort            *cxport = 0;
  192. ULONG                    cxsigflag = 0;        /* signal for above */
  193.  
  194. CxObj                    *broker = NULL;        /* Our broker */
  195.  
  196. #define POP_KEY_ID (86L)                    /* pop up identifier */
  197.  
  198. struct NewBroker mynb = {
  199.     NB_VERSION,                        /* Library needs to know version */
  200.     0 /*TXT(0)*/,                    /* broker internal name             */
  201.     0 /*TXT(3)*/,                    /* commodity title                 */
  202.     0 /*TXT(4)*/,                    /* description                 */
  203.     NBU_NOTIFY | NBU_UNIQUE,        /* We want to be the only broker */
  204.                                     /* with this name and we want to */
  205.                                     /* be notified of any attempts     */
  206.                                     /* to add a commodity with the     */
  207.                                     /* same name                     */
  208.     COF_SHOW_HIDE,                    /* flags                         */
  209.     0,                                /* default priority                 */
  210.     NULL,                            /* port, will fill in             */
  211.     0                                /* channel (reserved)             */
  212. };
  213.  
  214. /* Eine "input expression" die auf DISK_INSERTED paßt */
  215.  
  216. IX diskix = {
  217.     IX_VERSION,                /* required */
  218.     IECLASS_DISKINSERTED,
  219.     0,                        /* Code   */
  220.     ~0,                        /* CodeMask   */
  221.     
  222.     0,                      /* qualifier I am interested in  */
  223.     0,
  224.     0                       /* synonyms irrelevant           */
  225. };
  226.  
  227. #define CX_DISK_ID (87L)
  228.  
  229.  
  230. /********************************************************************
  231.  * Trackdisk-Support-Funktion(en)
  232.  */
  233.  
  234.  
  235. int GetChangeNum( int unit )
  236. {
  237.     if( !ioexttd[unit] ) return( 0 );
  238.     
  239.     ioexttd[unit]->iotd_Req.io_Command = TD_CHANGENUM;
  240.     DoIO( ioexttd[unit] );
  241.     return( ioexttd[unit]->iotd_Req.io_Actual );
  242. }
  243.  
  244.  
  245. int GetBADNum( void )
  246. {
  247.     int result=-1, i, cn;
  248.     struct InfoData *infoData;
  249.     struct MsgPort *port;
  250.     
  251.     if( !(infoData = AllocMem(sizeof(struct InfoData),MEMF_PUBLIC)) )
  252.         return -1;
  253.     
  254.     /* ermitteln, WO eine Disk eingelegt wurde */
  255.     for( i=0; i<=3; i++ )
  256.     {
  257.         if( cn = GetChangeNum(i) )
  258.         {
  259.             if( (cn>changenum[i]) && (port=DeviceProc(DiskName[i])) )
  260.             {
  261.                 /* und ob die 'BAD' oder 'NDOS' ist */
  262.                 if( DoPkt( port, ACTION_DISK_INFO,
  263.                            MKBADDR(infoData), 0, 0, 0, 0 ) )
  264.                 {
  265.                     if( infoData->id_DiskType == ID_UNREADABLE_DISK 
  266.                      || infoData->id_DiskType == ID_NOT_REALLY_DOS )
  267.                         result=i;
  268.                 }
  269.             }
  270.             
  271.             changenum[i] = cn;
  272.         }
  273.     }
  274.     
  275.     FreeMem( infoData, sizeof(struct InfoData) );
  276.     return( result );
  277. }
  278.  
  279.  
  280. /********************************************************************
  281.  * INITIALISIERUNG
  282.  */
  283.  
  284.  
  285. void LiesProgrammTexte( char *filename )
  286. {
  287.     BPTR file;
  288.     long size, i;
  289.     char *ts;
  290.     
  291.     if( file = Open(filename,MODE_OLDFILE) )
  292.     {
  293.         size = Seek( file, Seek(file,0,OFFSET_END), OFFSET_BEGINNING );
  294.         
  295.         if( TextSpeicher = AllocMem(size+4, NULL) )
  296.         {
  297.             *((long *)TextSpeicher) = size+4;
  298.             Read( file, TextSpeicher+4, size );
  299.             
  300.             for( i=0, ts=TextSpeicher+4;
  301.                  i < _COUNT_TXT;
  302.                  i++, ts+=strlen(ts)+1 )
  303.             {
  304.                 ProgrammText[i] = ts;
  305.             }
  306.         }
  307.         
  308.         Close( file );
  309.     }
  310. }
  311.  
  312.  
  313. void InitAll( int argc, char **argv )
  314. {
  315.     char *str;
  316.     CxObj *cxo;
  317.     int i, dr=0;
  318.     
  319.             /*** Libraries öffnen... ***/
  320.     
  321.     if (!(GfxBase = (struct GfxBase *)
  322.         OpenLibrary("graphics.library", 36L)))
  323.         ende(20, "Requires V36 graphics.library");
  324.  
  325.     if (!(IntuitionBase = (struct IntuitionBase *)
  326.         OpenLibrary("intuition.library", 36L)))
  327.         ende(20, "Requires V36 intuition.library");
  328.  
  329.     if (!(GadToolsBase = OpenLibrary("gadtools.library", 36L)))
  330.         ende(20, "Requires V36 gadtools.library");
  331.  
  332.     CxBase = OpenLibrary("commodities.library", 36);
  333.     if(!CxBase) ende(20,"Requires V36 commodities.library");
  334.     
  335.     IconBase = OpenLibrary("icon.library", 36);
  336.     if(!IconBase) ende(20,"Requires V36 icon.library");
  337.     
  338.             /*** ToolTypes (Argv) scannen ***/
  339.     
  340.     ttypes = ArgArrayInit( argc, argv );
  341.     
  342.     drive = ArgInt( ttypes, "DRIVE", 0 );
  343.     strcpy( name, ArgString(ttypes, "NAME", "Empty") );
  344.     
  345.     if( str = ArgString(ttypes, "FLAGS", NULL) )
  346.     {
  347.         bffs      = MatchToolValue( str, "FFS" );
  348.         bnoicons  = MatchToolValue( str, "NOICONS" );
  349.         bquick    = MatchToolValue( str, "QUICK" );
  350.         
  351.         bnoverify = MatchToolValue( str, "NOVERIFY" );
  352.         binstall  = MatchToolValue( str, "INSTALL" );
  353.         beject    = MatchToolValue( str, "EJECT" );
  354.     }
  355.     
  356.     /* Die Texte einlesen */
  357.     LiesProgrammTexte( ArgString(ttypes,"LANGUAGEFILE","FoCo.txt") );
  358.     
  359.     /* und einsetzen */
  360.     formatreq.es_Title            = TXT(0);
  361.     formatreq.es_TextFormat        = TXT(1);
  362.     formatreq.es_GadgetFormat    = TXT(2);
  363.     quitreq.es_Title            = TXT(0);
  364.     quitreq.es_TextFormat        = TXT(14);
  365.     quitreq.es_GadgetFormat        = TXT(2);
  366.     mynb.nb_Name                = TXT(0);
  367.     mynb.nb_Title                = TXT(3);
  368.     mynb.nb_Descr                = TXT(4);
  369.     
  370.             /*** Trackdisk.device öffnen: ***/
  371.     
  372.     if( !(tdport = CreateMsgPort()) )
  373.         ende(20,"Couldn't create TD MsgPort");
  374.     
  375.     /* alle 4 Units antesten */
  376.     for( i=0; i<=3; i++ )
  377.     {
  378.         if( ioexttd[i] = CreateIORequest(tdport, sizeof(struct IOExtTD)) )
  379.         {
  380.             if( OpenDevice(TD_NAME, i, ioexttd[i], TDF_ALLOW_NON_3_5) )
  381.             {
  382.                 DeleteIORequest( ioexttd[i] );
  383.                 ioexttd[i] = 0;
  384.             }
  385.             else
  386.             {
  387.                 changenum[i] = GetChangeNum(i);
  388.                 /* in Liste für CycleGadget aufnehmen */
  389.                 DiskList[dr++] = DiskName[i];
  390.             }
  391.         }
  392.     }
  393.     
  394.             /*** Hotkey installieren: ***/
  395.     
  396.     cxport = CreateMsgPort();
  397.     
  398.     if( !cxport )
  399.         ende(20,"Couldn't create MsgPort");
  400.         
  401.     cxsigflag = 1L << cxport->mp_SigBit;    /* Signal Mask für Wait */
  402.  
  403.     /* Broker erzeugen */
  404.     
  405.     mynb.nb_Port = cxport;
  406.     mynb.nb_Pri  = ArgInt( ttypes, "CX_PRIORITY", 0 );
  407.     
  408.     if( !(broker = CxBroker(&mynb, NULL)) )
  409.         ende(0,0);
  410.     
  411.     /* Hotkey installieren */
  412.     
  413.     AttachCxObj( broker,
  414.         HotKey( hotstr=ArgString(ttypes,"CX_POPKEY","lcommand f"),
  415.             cxport, POP_KEY_ID) );
  416.     
  417.     /* Disk-Insert-Filter installieren */
  418.     
  419.     if( cxo = CxFilter(NULL) )
  420.     {
  421.         SetFilterIX( cxo, &diskix );
  422.         AttachCxObj( cxo, CxSender(cxport, CX_DISK_ID) );
  423.         
  424.         AttachCxObj( broker, cxo );
  425.     }
  426.     
  427.     /* Auf summierten Fehler prüfen */
  428.     if( CxObjError(broker) )
  429.         ende(20,"Internal commodities error");
  430.     
  431.     /* Alles o.k., Broker aktivieren */
  432.     ActivateCxObj(broker,1L);
  433.     
  434.     /* soll das Fenster gleich geöffnet werden? */
  435.     if( str=ArgString(ttypes,"CX_POPUP",NULL) )
  436.     {
  437.         if( MatchToolValue(str,"YES") )
  438.             ShowWindow();
  439.     }
  440. }
  441.  
  442.  
  443. /********************************************************************
  444.  * GADGETS
  445.  */
  446.  
  447.  
  448. struct Gadget *CreateAllGadgets(
  449.     struct Gadget **glistptr, void *vi, UWORD topborder )
  450. {
  451.     struct NewGadget ng;
  452.     struct Gadget *gad;
  453.     long tl;                /* wg. cc-Fehler */
  454.  
  455.     #define TXTLNG(n) TextLength( rp, TXT(n), strlen(TXT(n)) )
  456.  
  457.     /*  All the gadget creation calls accept a pointer to the previous
  458.         gadget, and link the new gadget to that gadget's NextGadget field.
  459.         Also, they exit gracefully, returning NULL, if any previous gadget
  460.         was NULL.  This limits the amount of checking for failure that
  461.         is needed.  You only need to check before you tweak any gadget
  462.         structure or use any of its fields, and finally once at the end,
  463.         before you add the gadgets. */
  464.  
  465.     /*  We obligingly perform the following operation, required of
  466.         any program that uses the toolkit.  It gives the toolkit a
  467.         place to stuff context data: */
  468.     gad = CreateContext(glistptr);
  469.     
  470.     /*  Fill out a NewGadget structure to describe the gadget we want
  471.         to create: */
  472.  
  473.     ng.ng_TextAttr = mysc->Font;
  474.     ng.ng_VisualInfo = vi;
  475.     
  476.     /* Längeren Label ermitteln (PropFonts!) */
  477.     
  478.     tl = TXTLNG( 5 );
  479.     
  480.     if( TXTLNG( 6 ) > tl )
  481.     {
  482.         tl = TXTLNG( 6 );
  483.     }
  484.     
  485.     /* Drive: Cycler */
  486.     tl += mysc->WBorLeft + INTERWIDTH + 8;
  487.                 /* +8 wegen Abstand Text<->Gadget */
  488.     ng.ng_LeftEdge = tl;
  489.     ng.ng_TopEdge = topborder + INTERHEIGHT;
  490.     tl = TextLength( rp, "_DFX:_", 5 );
  491.     ng.ng_Width = 40 + tl;                /* (26) ist das "@" plus Seitenplatz */
  492.     ng.ng_Height = mysc->Font->ta_YSize + 4;
  493.     ng.ng_Flags = NG_HIGHLABEL;
  494.     ng.ng_GadgetText = TXT(5);
  495.     ng.ng_GadgetID = GAD_DRIVE;
  496.     drivegad = gad = CreateGadget( CYCLE_KIND, gad, &ng,
  497.         GTCY_Labels, DiskList,
  498.         GTCY_Active, drive,
  499.         TAG_DONE );
  500.     
  501.     /* Name: String */
  502.     ng.ng_TopEdge += gad->Height + INTERHEIGHT;
  503.     ng.ng_Width = 22 * Xwidth;
  504.     ng.ng_Height = mysc->Font->ta_YSize + 6;    /* 2 Border + 1 freie oben&unten */
  505.     ng.ng_GadgetText = TXT(6);
  506.     ng.ng_GadgetID = GAD_NAME;
  507.     namegad = gad = CreateGadget( STRING_KIND, gad, &ng,
  508.         GTST_MaxChars, 32,
  509.         GTST_String, name,
  510.         TAG_DONE );
  511.     
  512.     WinWidth = gad->LeftEdge + ng.ng_Width + INTERWIDTH;
  513.         /* in ng.ng_Width sind auch die Ränder enthalten */
  514.  
  515.     /*--------------------*/
  516.     
  517.     /* FFS: Checkbox */
  518.     /* Checkbox-Breite: siehe gad->Width */
  519.     tl = mysc->WBorLeft + INTERWIDTH + TXTLNG( 7 ) + 8;
  520.     ng.ng_LeftEdge     = tl;
  521.     ng.ng_TopEdge    += ng.ng_Height + INTERHEIGHT;
  522.     ng.ng_Height     = mysc->Font->ta_YSize;
  523.     ng.ng_GadgetText = TXT(7);
  524.     ng.ng_Flags         = PLACETEXT_LEFT;
  525.     ng.ng_GadgetID     = GAD_FFS;
  526.     ffsgad = gad = CreateGadget( CHECKBOX_KIND, gad, &ng,
  527.         GTCB_Checked, bffs,
  528.         TAG_DONE );
  529.  
  530.     /* NoVerify: Checkbox */
  531.     tl = mysc->WBorLeft + INTERWIDTH + TXTLNG( 15 ) + 8;
  532.     ng.ng_LeftEdge     = tl;
  533.     ng.ng_TopEdge    += ng.ng_Height + INTERHEIGHT;
  534.     ng.ng_GadgetText = TXT(15);
  535.     ng.ng_Flags         = PLACETEXT_LEFT;
  536.     ng.ng_GadgetID     = GAD_NOVERIFY;
  537.     noverifygad = gad = CreateGadget( CHECKBOX_KIND, gad, &ng,
  538.         GTCB_Checked, bnoverify,
  539.         TAG_DONE );
  540.  
  541.     if( ffsgad->LeftEdge < gad->LeftEdge )
  542.         ffsgad->LeftEdge = gad->LeftEdge;
  543.     else
  544.         gad->LeftEdge = ffsgad->LeftEdge;
  545.  
  546.     /* NoIcons: Checkbox */
  547.     tl = TXTLNG( 8 ) + 8;
  548.     ng.ng_LeftEdge     = ffsgad->LeftEdge + ffsgad->Width
  549.                      + 3*INTERWIDTH + tl;
  550.     ng.ng_TopEdge    -= ng.ng_Height + INTERHEIGHT;
  551.     ng.ng_GadgetText = TXT(8);
  552.     ng.ng_GadgetID     = GAD_NOICONS;
  553.     noiconsgad = gad = CreateGadget( CHECKBOX_KIND, gad, &ng,
  554.         GTCB_Checked, bnoicons,
  555.         TAG_DONE );
  556.  
  557.     /* Install: Checkbox */
  558.     tl = TXTLNG( 16 ) + 8;
  559.     ng.ng_LeftEdge     = noverifygad->LeftEdge + noverifygad->Width
  560.                      + 3*INTERWIDTH + tl;
  561.     ng.ng_TopEdge    += ng.ng_Height + INTERHEIGHT;
  562.     ng.ng_GadgetText = TXT(16);
  563.     ng.ng_GadgetID     = GAD_INSTALL;
  564.     installgad = gad = CreateGadget( CHECKBOX_KIND, gad, &ng,
  565.         GTCB_Checked, binstall,
  566.         TAG_DONE );
  567.  
  568.     if( noiconsgad->LeftEdge < gad->LeftEdge )
  569.         noiconsgad->LeftEdge = gad->LeftEdge;
  570.     else
  571.         gad->LeftEdge = noiconsgad->LeftEdge;
  572.  
  573.     /* Quick: Checkbox */
  574.     tl = TXTLNG( 9 ) + 8;
  575.     ng.ng_LeftEdge     = noiconsgad->LeftEdge + noiconsgad->Width
  576.                      + 3*INTERWIDTH + tl;
  577.     ng.ng_TopEdge    -= ng.ng_Height + INTERHEIGHT;
  578.     ng.ng_GadgetText = TXT(9);
  579.     ng.ng_GadgetID     = GAD_QUICK;
  580.     quickgad = gad = CreateGadget( CHECKBOX_KIND, gad, &ng,
  581.         GTCB_Checked, bquick,
  582.         TAG_DONE );
  583.     
  584.     /* Eject: Checkbox */
  585.     tl = TXTLNG( 17 ) + 8;
  586.     ng.ng_LeftEdge     = installgad->LeftEdge + installgad->Width
  587.                          + 3*INTERWIDTH + tl;
  588.     ng.ng_TopEdge    += ng.ng_Height + INTERHEIGHT;
  589.     ng.ng_GadgetText = TXT(17);
  590.     ng.ng_GadgetID     = GAD_EJECT;
  591.     ejectgad = gad = CreateGadget( CHECKBOX_KIND, gad, &ng,
  592.         GTCB_Checked, beject,
  593.         TAG_DONE );
  594.     
  595.     if( quickgad->LeftEdge < gad->LeftEdge )
  596.         quickgad->LeftEdge = gad->LeftEdge;
  597.     else
  598.         gad->LeftEdge = quickgad->LeftEdge;
  599.  
  600.     tl = gad->LeftEdge + gad->Width + INTERWIDTH;
  601.     if( tl > WinWidth ) WinWidth = tl;
  602.     
  603.     /*--------------------*/
  604.     
  605.     /* OK: Button */
  606.     /* diese sollten etwas weiter entfernt sein */
  607.     ng.ng_LeftEdge     = mysc->WBorLeft + INTERWIDTH;
  608.     ng.ng_TopEdge    += gad->Height + mysc->Font->ta_YSize;
  609.     ng.ng_Height     = mysc->Font->ta_YSize + 4;
  610.     tl                 = TXTLNG( 10 ) + 3*INTERWIDTH;
  611.                         /* 1*INTERWIDTH deckt die beiden Ränder ab */
  612.     ng.ng_Width         = tl;
  613.     ng.ng_GadgetText = TXT(10);
  614.     ng.ng_Flags         = PLACETEXT_IN + NG_HIGHLABEL;
  615.     ng.ng_GadgetID     = GAD_OK;
  616.     gad = CreateGadget( BUTTON_KIND, gad, &ng,
  617.         TAG_DONE );
  618.     
  619.     /* Cancel: Button */
  620.     tl                 = TXTLNG( 11 ) + 3*INTERWIDTH;
  621.     ng.ng_Width         = tl;
  622.     ng.ng_LeftEdge     = WinWidth - INTERWIDTH - ng.ng_Width;
  623.     ng.ng_GadgetText = TXT(11);
  624.     ng.ng_Flags         = 0;
  625.     ng.ng_GadgetID     = GAD_CANCEL;
  626.     gad = CreateGadget( BUTTON_KIND, gad, &ng,
  627.         TAG_DONE );
  628.     
  629.     WinHeight = ng.ng_TopEdge + gad->Height + INTERHEIGHT - topborder;
  630.         /* bei Buttons ist gad->Height korrekt (wg.3D) */
  631.  
  632.     return(gad);
  633. }
  634.  
  635.  
  636. /********************************************************************
  637.  * FENSTER
  638.  */
  639.  
  640.  
  641. void ShowWindow( void )
  642. {
  643.     if( mywin )
  644.     {
  645.         ScreenToFront( mywin->WScreen );
  646.         WindowToFront( mywin );
  647.         ActivateWindow( mywin );
  648.         GT_SetGadgetAttrs( drivegad, mywin, NULL,
  649.             GTCY_Active, drive,
  650.             TAG_END );
  651.         ActivateGadget( namegad, mywin, NULL );
  652.         return;
  653.     }
  654.     
  655.     if( !(mysc = LockPubScreen(NULL)) )
  656.         return;
  657.     
  658.     /* Da ich TextLength() benutzen will, brauche ich den RastPort */
  659.     rp = &mysc->RastPort;
  660.     
  661.     topborder = mysc->WBorTop + (mysc->Font->ta_YSize + 1);
  662.     Xwidth = TextLength( rp, "XX", 2 ) / 2;
  663.     
  664.     if( !(vi = GetVisualInfo(mysc, TAG_DONE)) )
  665.     {
  666.         UnlockPubScreen( NULL, mysc );
  667.         return;
  668.     }
  669.     
  670.     if( !CreateAllGadgets(&glist, vi, topborder) )
  671.     {
  672.         FreeVisualInfo( vi );
  673.         UnlockPubScreen( NULL, mysc );
  674.         return;
  675.     }
  676.     
  677.     /* Open the window: */
  678.     mywin = OpenWindowTags( NULL,
  679.         WA_Title,         TXT(12),
  680.         WA_Left,          (mysc->Width  - WinWidth ) / 2,
  681.         WA_Top,           (mysc->Height - WinHeight) / 2,
  682.         WA_InnerWidth,    WinWidth,
  683.         WA_InnerHeight,   WinHeight,
  684.         WA_AutoAdjust,    TRUE,
  685.         WA_PubScreen,     mysc,
  686.         
  687.         WA_Activate,      TRUE,
  688.         WA_DragBar,       TRUE,
  689.         WA_DepthGadget,   TRUE,
  690.         WA_CloseGadget,   TRUE,
  691.         WA_SimpleRefresh, TRUE,
  692.         WA_RMBTrap,       TRUE,
  693.         
  694.         WA_IDCMP, CLOSEWINDOW | REFRESHWINDOW |
  695.                   CYCLEIDCMP | STRINGIDCMP | CHECKBOXIDCMP,
  696.         TAG_DONE );
  697.         
  698.     if( !mywin )
  699.     {
  700.         FreeGadgets( glist );
  701.         FreeVisualInfo( vi );
  702.         UnlockPubScreen( NULL, mysc );
  703.         return;
  704.     }
  705.     
  706.     ScreenToFront( mywin->WScreen );
  707.     
  708.     /*  AddGadgets + Intuition-Refresh + GadTools-Refresh: */
  709.     AddGList( mywin, glist, -1, -1, NULL );
  710.     RefreshGList( glist, mywin, NULL, -1 );
  711.     GT_RefreshWindow( mywin, NULL );
  712.     
  713.     windowsignal = 1 << mywin->UserPort->mp_SigBit;
  714.     ActivateGadget( namegad, mywin, NULL );
  715. }
  716.  
  717.  
  718. void HideWindow( void )
  719. {
  720.     if( mywin )
  721.     {
  722.         /* Stringgadget auslesen (für nächsten CreateGadgets oder DoFormat) */
  723.         strcpy( name, ((struct StringInfo *)namegad->SpecialInfo)->Buffer );
  724.         
  725.         CloseWindow( mywin );
  726.         FreeGadgets(glist);
  727.         FreeVisualInfo(vi);
  728.         UnlockPubScreen(NULL, mysc);
  729.         
  730.         mywin = 0;
  731.         windowsignal = 0;
  732.     }
  733. }
  734.  
  735.  
  736. /********************************************************************
  737.  * SHUTDOWN
  738.  */
  739.  
  740.  
  741. void ende( int code, STRPTR error )
  742. {
  743.     struct Message    *msg;
  744.     int i;
  745.     
  746.     /********** Hotkey-Cleanup... ***********/
  747.     
  748.     if( broker )
  749.     {
  750.         DeleteCxObjAll(broker);        /* safe, even if NULL    */
  751.         broker     = NULL;
  752.     }
  753.     
  754.     if( cxport )
  755.     {
  756.         /* now that messages are shut off, clear port    */
  757.         while(msg=GetMsg(cxport)) ReplyMsg(msg);
  758.         DeleteMsgPort(cxport);
  759.         
  760.         cxport     = NULL;
  761.     }
  762.     
  763.     ArgArrayDone();
  764.     
  765.     if(IconBase)    CloseLibrary(IconBase);
  766.     if(CxBase)        CloseLibrary(CxBase);
  767.     
  768.     /************ Window-Cleanup... *************/
  769.     
  770.     if( mywin )
  771.     {
  772.         CloseWindow(mywin);
  773.         FreeGadgets(glist);
  774.         FreeVisualInfo(vi);
  775.         if(mysc) UnlockPubScreen(NULL, mysc);
  776.     }
  777.     
  778.     /************ Trackdisk-Cleanup... *************/
  779.     
  780.     for( i=0; i<=3; i++ )
  781.     {
  782.         if( ioexttd[i] )
  783.         {
  784.             CloseDevice( ioexttd[i] );
  785.             DeleteIORequest( ioexttd[i] );
  786.         }
  787.     }
  788.     
  789.     if(tdport) DeleteMsgPort(tdport);
  790.     
  791.     /************ Rest... *************/
  792.     
  793.     if(TextSpeicher) FreeMem( TextSpeicher, *((long *)TextSpeicher) );
  794.     
  795.     if(GadToolsBase) CloseLibrary(GadToolsBase);
  796.     if(IntuitionBase) CloseLibrary(IntuitionBase);
  797.     if(GfxBase) CloseLibrary(GfxBase);
  798.     
  799.     if(error) Printf("Error: %s\n", error);
  800.     
  801.     exit(code);
  802. }
  803.  
  804.  
  805. /********************************************************************
  806.  * FORMATIEREN
  807.  */
  808.  
  809.  
  810. void DoFormat( void )
  811. {
  812.     char com[256];
  813.     BPTR ifh, ofh;
  814.     
  815.     strcpy( com, "SYS:System/Format DRIVE " );
  816.     strcat( com, DiskList[drive] );
  817.     strcat( com, " NAME \"" );
  818.     strcat( com, name );
  819.     strcat( com, "\"" );
  820.     
  821.     if( bffs )        strcat( com, " FFS" );
  822.     if( bnoicons )    strcat( com, " NOICONS" );
  823.     if( bquick )    strcat( com, " QUICK" );
  824.     
  825.     if( bnoverify )    strcat( com, " NOVERIFY" );
  826.     if( binstall )    strcat( com, " INSTALL" );
  827.     if( beject )    strcat( com, " EJECT" );
  828.     
  829.     ifh = Open( "NIL:",  MODE_OLDFILE   );
  830.     ofh = Open( TXT(13), MODE_READWRITE );
  831.     
  832.     if( ofh )
  833.     {
  834.         SystemTags( com,
  835.             SYS_Input,  ifh,
  836.             SYS_Output, ofh,
  837.             SYS_Asynch, TRUE,
  838.             TAG_END );
  839.     }
  840. }
  841.  
  842.  
  843. /********************************************************************
  844.  * MESSAGES VERARBEITEN
  845.  */
  846.  
  847.  
  848. void handleCxMsg( struct Message *msg )
  849. {
  850.     ULONG    msgid;
  851.     ULONG    msgtype;
  852.     int        d;
  853.  
  854.     msgid    = CxMsgID( msg );
  855.     msgtype = CxMsgType( msg );
  856.  
  857.     ReplyMsg( msg );
  858.  
  859.     switch( msgtype )
  860.     {
  861.         case CXM_IEVENT:
  862.             switch(msgid)
  863.             {
  864.                 case POP_KEY_ID:
  865.                 
  866.                     ShowWindow();
  867.                     break;
  868.                     
  869.                 case CX_DISK_ID:
  870.                 
  871.                     d = GetBADNum();
  872.                     
  873.                     if( d >= 0 )
  874.                     {
  875.                         if( EasyRequest( NULL, &formatreq, NULL, DiskName[d] ) )
  876.                         {
  877.                             for( drive=0; drive<=3 && DiskList[drive]; drive++ )
  878.                                 if( strcmp(DiskList[drive],DiskName[d])==0 )
  879.                                     break;
  880.                             if( !DiskList[drive] )
  881.                                 drive=0;
  882.                             
  883.                             ShowWindow();
  884.                         }
  885.                     }
  886.                     
  887.                     break;
  888.             }
  889.             break;
  890.             
  891.         case CXM_COMMAND:
  892.             switch(msgid)
  893.             {
  894.                 case CXCMD_DISABLE:
  895.                     ActivateCxObj(broker,0L);
  896.                     break;
  897.                 case CXCMD_ENABLE:
  898.                     ActivateCxObj(broker,1L);
  899.                     break;
  900.                     
  901.                 case CXCMD_UNIQUE:    /* Someone has tried to run us again */
  902.                 case CXCMD_APPEAR:    /* Time to pop up the window */
  903.                     /* If someone tries to run us a second time the second copy
  904.                      * of the program will fail and we will be sent a
  905.                      * CXCMD_UNIQUE message. If we support a window then we
  906.                      * Make our window appear since that is what the user wanted.
  907.                      * If we do not support a window then we kill the currently
  908.                      * running version 'this one' so that things like autopoint
  909.                      * can be toggled on/off by running them a second time.
  910.                      */
  911.                     ShowWindow();
  912.                     break;                /* the window */
  913.                 case CXCMD_DISAPPEAR:
  914.                     HideWindow();
  915.                     break;
  916.                 
  917.                 case CXCMD_KILL:
  918.                     ende(0,0);
  919.                     break;
  920.             }
  921.             break;
  922.     }
  923. }
  924.  
  925.  
  926. void handleWinMsg( void )
  927. {
  928.     struct IntuiMessage *imsg;
  929.     struct Gadget *gad;
  930.     ULONG imsgClass;
  931.     UWORD imsgCode;
  932.  
  933.     while( imsg = GT_GetIMsg(mywin->UserPort) )
  934.     {
  935.         imsgClass = imsg->Class;
  936.         imsgCode = imsg->Code;
  937.         /*  Gadget vorrausgesetzt natürlich, macht aber nix... */
  938.         gad = (struct Gadget *)imsg->IAddress;
  939.         GT_ReplyIMsg(imsg);
  940.         
  941.         switch( imsgClass )
  942.         {
  943.             case GADGETUP:
  944.             case GADGETDOWN:
  945.                 switch( gad->GadgetID )
  946.                 {
  947.                     case GAD_DRIVE:
  948.                         drive = imsgCode;
  949.                         break;
  950.                     case GAD_NAME:
  951.                         strcpy( name, ((struct StringInfo *) gad
  952.                                         -> SpecialInfo) -> Buffer );
  953.                         HideWindow();
  954.                         DoFormat();
  955.                         return;
  956.                         break;
  957.                         
  958.                     case GAD_FFS:
  959.                         bffs      = gad->Flags & SELECTED;
  960.                         break;
  961.                     case GAD_NOICONS:
  962.                         bnoicons  = gad->Flags & SELECTED;
  963.                         break;
  964.                     case GAD_QUICK:
  965.                         bquick    = gad->Flags & SELECTED;
  966.                         break;
  967.                         
  968.                     case GAD_NOVERIFY:
  969.                         bnoverify = gad->Flags & SELECTED;
  970.                         break;
  971.                     case GAD_INSTALL:
  972.                         binstall  = gad->Flags & SELECTED;
  973.                         break;
  974.                     case GAD_EJECT:
  975.                         beject    = gad->Flags & SELECTED;
  976.                         break;
  977.                         
  978.                     case GAD_OK:
  979.                         HideWindow();
  980.                         DoFormat();
  981.                         return;
  982.                         break;
  983.                     case GAD_CANCEL:
  984.                         HideWindow();
  985.                         return;
  986.                         break;
  987.                 }
  988.                 
  989.                 ActivateGadget( namegad, mywin, NULL );
  990.                 break;
  991.             
  992.             case REFRESHWINDOW:
  993.                 GT_BeginRefresh(mywin);
  994.                 GT_EndRefresh(mywin, TRUE);
  995.                 break;
  996.             
  997.             case CLOSEWINDOW:
  998.                 if( EasyRequest(NULL, &quitreq, NULL, NULL) )
  999.                 {
  1000.                     ende(0,0);
  1001.                 }
  1002.                 else
  1003.                 {
  1004.                     HideWindow();
  1005.                     return;
  1006.                 }
  1007.                 break;
  1008.         }
  1009.     }
  1010. }
  1011.  
  1012.  
  1013. /********************************************************************
  1014.  * MAIN
  1015.  */
  1016.  
  1017.  
  1018. void main( int argc, char *argv[] )
  1019. {
  1020.     ULONG sigrcvd;
  1021.     struct Message *msg;
  1022.     
  1023.     InitAll( argc, argv );
  1024.     
  1025.     do
  1026.     {
  1027.         /* auf eine Msg warten */
  1028.         sigrcvd = Wait ( SIGBREAKF_CTRL_E | cxsigflag | windowsignal );
  1029.         
  1030.         /* Commodities-Konvention: ETK ("easy to kill") */
  1031.         if( sigrcvd & SIGBREAKF_CTRL_E )
  1032.             ende(0,0);
  1033.         
  1034.         /* Fenster... */
  1035.         if( sigrcvd & windowsignal )
  1036.             handleWinMsg();
  1037.         
  1038.         /* Msg vom Broker... */
  1039.         while(cxport && (msg=GetMsg(cxport)))
  1040.             handleCxMsg(msg);
  1041.         
  1042.     } while( 1 );
  1043. }
  1044.